package com.toune.dltools

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import java.io.*

/**
 * Assets读取文件工具类
 */
object DLAssetsTool {
    /**
     * 获取assets目录下的图片
     *
     * @param context  上下文
     * @param fileName 文件名
     * @return Bitmap图片
     */
    fun getImageFromAssetsFile(
        context: Context,
        fileName: String?
    ): Bitmap? {
        var bitmap: Bitmap? = null
        val assetManager = context.assets
        try {
            val `is` = assetManager.open(fileName!!)
            bitmap = BitmapFactory.decodeStream(`is`)
            `is`.close()
        } catch (e: IOException) {
            e.printStackTrace()
        }
        return bitmap
    }

    /**
     * 获取assets目录下的单个文件
     * 这种方式只能用于webview加载
     * 读取文件夹，直接取路径是不行的
     *
     * @param context  上下文
     * @param fileName 文件夹名
     * @return File
     */
    fun getFileFromAssetsFile(
        context: Context?,
        fileName: String
    ): File {
        val path = "file:///android_asset/$fileName"
        return File(path)
    }

    /**
     * 获取assets目录下所有文件
     *
     * @param context 上下文
     * @param path    文件地址
     * @return files[] 文件列表
     */
    fun getFilesFromAssets(
        context: Context,
        path: String?
    ): Array<String?>? {
        val assetManager = context.assets
        var files: Array<String?>? = null
        try {
            files = assetManager.list(path!!)
        } catch (e: IOException) {
            e.printStackTrace()
        }
        for (str in files!!) {
//            LogUtils.logInfoStar(str);
        }
        return files
    }
    /**
     * 将assets下的文件放到sd指定目录下
     *
     * @param context    上下文
     * @param assetsPath assets下的路径
     */
    @JvmOverloads
    fun putAssetsToSDCard(
        context: Context,
        assetsPath: String,
        sdCardPath: String = context.getExternalFilesDir(null)!!.absolutePath
    ) {
        var sdCardPath = sdCardPath
        val assetManager = context.assets
        try {
            val files = assetManager.list(assetsPath)
            if (files!!.size == 0) {
                // 说明assetsPath为空,或者assetsPath是一个文件
                val `is` = assetManager.open(assetsPath)
                val mByte = ByteArray(1024)
                var bt = 0
                val file = File(
                    sdCardPath + File.separator
                            + assetsPath.substring(assetsPath.lastIndexOf('/'))
                )
                if (!file.exists()) {
                    // 创建文件
                    file.createNewFile()
                } else {
                    //已经存在直接退出
                    return
                }

                // 写入流
                val fos = FileOutputStream(file)
                // assets为文件,从文件中读取流
                while (`is`.read(mByte).also { bt = it } != -1) {
                    // 写入流到文件中
                    fos.write(mByte, 0, bt)
                }

                // 刷新缓冲区
                fos.flush()
                // 关闭读取流
                `is`.close()
                // 关闭写入流
                fos.close()
            } else {
                // 当mString长度大于0,说明其为文件夹
                sdCardPath = sdCardPath + File.separator + assetsPath
                val file = File(sdCardPath)
                if (!file.exists()) {
                    // 在sd下创建目录
                    file.mkdirs()
                }

                // 进行递归
                for (stringFile in files) {
                    putAssetsToSDCard(
                        context, assetsPath + File.separator
                                + stringFile, sdCardPath
                    )
                }
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    fun getFromAssets(context: Context, fileName: String?): String? {
        try {
            val inputReader =
                InputStreamReader(context.resources.assets.open(fileName!!))
            val bufReader = BufferedReader(inputReader)
            var line: String? = ""
            var Result: String? = ""
            while (bufReader.readLine().also { line = it } != null) Result += line
            return Result
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return ""
    }

    fun getFilePath(fileName: String?): String {
        return "file:///android_asset/$fileName"
    }
}